package net.lab1024.sa.admin.module.business.traffic.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

/**
 * 艾比摄像机 TCP 接入配置
 */
@Data
@Component
@ConfigurationProperties(prefix = "aibi.camera")
public class AibiCameraProperties {

    /**
     * 是否启用 TCP 客户端.
     */
    private boolean enabled = true;

    /**
     * 当配置中心缺少阈值时的默认切换阈值.
     */
    private double defaultThreshold = 1.5D;

    /**
     * TCP 通信配置.
     */
    private final Tcp tcp = new Tcp();

    /**
     * 设备与道路配置.
     */
    private final Device device = new Device();

    /**
     * 车道映射配置.
     */
    private final Lane lane = new Lane();

    /**
     * 模式切换配置.
     */
    private final Mode mode = new Mode();

    /**
     * 重连配置.
     */
    private final Retry retry = new Retry();

    @Data
    public static class Tcp {
        /**
         * 摄像机 TCP 服务地址.
         */
        private String host = "127.0.0.1";

        /**
         * 摄像机 TCP 服务端口.
         */
        private int port = 10086;

        /**
         * 读取超时时间（毫秒）.
         */
        private int readTimeoutMillis = 30_000;

        /**
         * 连接超时时间（毫秒）.
         */
        private int connectTimeoutMillis = 5_000;
    }

    @Data
    public static class Device {
        /**
         * 道路编号.
         */
        private String roadCode = "1201100";

        /**
         * 可变灯牌设备编号.
         */
        private Integer deviceId = 2;

        /**
         * 摄像机编码（上报字段 jtll_ddbh）.
         */
        private String cameraCode = "1201100";
    }

    @Data
    public static class Lane {
        /**
         * 最左侧车道编码（ycsb_cdbh，如果为空则按 laneIndex 识别）.
         */
        private String leftLaneCode;

        /**
         * 左侧第二条车道编码（ycsb_cdbh，如果为空则按 laneIndex 识别）.
         */
        private String straightLaneCode;

        /**
         * 最左侧车道在 car_nums 列表中的索引.
         */
        private int leftLaneIndex = 0;

        /**
         * 左侧第二条车道在 car_nums 列表中的索引.
         */
        private int straightLaneIndex = 1;
    }

    @Data
    public static class Mode {
        /**
         * 当左转排队占优时下发的模式.
         */
        private String congestionMode = "LEFT_TURN";

        /**
         * 默认车道模式.
         */
        private String defaultMode = "STRAIGHT";

        /**
         * 复位阈值系数（乘以切换阈值作为恢复默认模式的下限，默认 0.8）.
         */
        private double revertFactor = 0.8D;

        /**
         * 连续持有同一模式的最短秒数，避免频繁抖动.
         */
        private long minimumHoldSeconds = 60L;
    }

    @Data
    public static class Retry {
        /**
         * 重连等待秒数.
         */
        private int reconnectDelaySeconds = 5;

        /**
         * 读写异常后的退避秒数.
         */
        private int errorBackoffSeconds = 5;
    }
}

